package User;

import java.util.Scanner;
import java.util.ArrayList;
import User.Users;

public class User_Mains{
    public static void main(String[] args) {
        ArrayList<Users> ulist = new ArrayList<>();
        Main(ulist);
    }


    //用户验证主界面
    public static void Main(ArrayList ulist) {
        Scanner sc = new Scanner(System.in);
        loop:
        while (true) {
            Users user = new Users();
            System.out.println("************欢迎来到用户验证界面************");
            System.out.println("请选择操作：1-登录 2-注册 3-忘记密码");
            System.out.println("请你进行选择：");
            String sr = sc.next();
            switch (sr) {
                //登录
                case "1": {
                    if(Denglu(ulist)){
                        System.out.println("登录成功！");
                        break;
                    }
                    else
                        break;
                }

                //注册
                case "2": {
                    if (Zhuce(user,ulist)) {
                        ulist.add(user);
                        System.out.println("注册成功！");
                        break;
                    } else
                        break;
                }

                //忘记密码
                case "3": {
                    if(Wangji(ulist)){
                        System.out.println("密码修改成功！");
                        break;
                    }else{
                        System.out.println("密码修改失败！");
                        break;
                    }

                }
                default:
                    System.out.println("选择错误，请重新选择！");
            }
        }
    }

    //注册
    public static boolean Zhuce(Users user,ArrayList ulist) {
        Scanner sc = new Scanner(System.in);

        //用户名
        while (true) {
            System.out.println("请输入用户名：");
            String name = sc.next();
            //用户名已存在,重新输入
            if (Juge(ulist,name)) {
                System.out.println("用户名已存在，请重新输入！");
                continue;
            }
            if (!Name(name))
                continue;  //用户名不合法，再次输入
            user.setUser_name(name);
            break;  //用户名合法
        }

        //手机号码
        while (true) {
            System.out.println("请输入手机号码：");
            String phone = sc.next();
            if (!Phone(phone))
                continue;  //手机号码错误，再次输入
            user.setUser_phone(phone);
            break;  // 手机号码正确
        }

        //身份证号
        while (true) {
            System.out.println("请输入身份证号");
            String id = sc.next();
            if (!Id(id))
                continue;  // 用户身份证号错误，再次输入
            user.setUser_Id(id);
            break;  // 用户身份证号正确
        }

        //密码
        while (true) {
            System.out.println("请输入密码：");
            String p1 = sc.next();
            System.out.println("请再次确认密码：");
            String p2 = sc.next();
            if (!Password(p1, p2))
                continue;  // 密码确认失败，再次输入
            user.setUser_password(p2);
            break;  //密码确认成功
        }
        return true;
    }

    //对用户名进行验证
    public static boolean Name(String name) {
        //用户名长度不合法，重新输入
        if (name.length() < 3 || name.length() > 15) {
            System.out.println("用户名长度错误，请重新输入！");
            return false;
        }
        //用户名内容不合法，重新输入
        int count = 0;  // 统计用户名中字母的个数
        int count1 = 0;  //统计用户名中数字的个数
        for (int i = 0; i < name.length(); i++) {
            //对用户名的内容进行判断
            char c = name.charAt(i);
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
                count++;
            else if (c >= '0' && c <= '9')
                count1++;
            else {
                System.out.println("用户名内含非法字符！");
                return false;
            }
        }
        //用户名不全为数字和字母，返回true
        if (count > 0 && count1 > 0)
            return true;
            //用户名全为数字或字母，返回false
        else {
            System.out.println("用户名不能全为数字或字母！");
            return false;
        }

    }

    //对用户身份证号进行验证
    public static boolean Id(String id) {
        //对长度进行验证
        if (id.length() != 18) {
            System.out.println("身份证号长度错误，请重新输入！");
            return false;
        }
        //对开头数字进行验证
        if (id.charAt(0) == '0') {
            System.out.println("身份证号不能以0为开头，请重新输入！");
            return false;
        }
        //对前17位进行验证
        for (int i = 0; i < id.length() - 1; i++) {
            if (id.charAt(i) < '0' || id.charAt(i) > '9'){
                System.out.println("身份证号错误，请重新输入！");
                return false;     // 前17位不全为数字，返回false
            }
        }
        //对最后一位进行验证
        char r = id.charAt(id.length() - 1);
        if (r >= '0' && r <= '9' || r == 'X' || r == 'x')
            return true;
        else {
            System.out.println("身份证号最后一位错误，请重新输入！");
            return false;
        }
    }

    //对用户密码进行验证
    public static  boolean Password(String p1, String p2) {
        if (p1.equals(p2))
            return true;
        else {
            System.out.println("二次密码不同，请再次输入！");
            return false;
        }

    }

    //对用户手机号进行验证
    public static boolean Phone(String phone) {
        //对手机号长度进行验证
        if (phone.length() != 11) {
            System.out.println("手机号码长度错误，请重新输入！");
            return false;
        }
        //对手机号开头进行验证
        if (phone.charAt(0) == '0') {
            System.out.println("手机号码不能以0开头，请重新输入！");
            return false;
        }
        //对手机号内容进行验证
        for (int i = 0; i < phone.length(); i++) {
            if (phone.charAt(i) < '0' || phone.charAt(i) > '9') {
                System.out.println("手机号码错误，请重新输入！");
                return false;
            }
        }
        return true;
    }

    //对用户名唯一性进行验证
    public static boolean Juge(ArrayList ulist,String word) {
        //存在返回true
        if (GetIndex(ulist, word) >= 0)
            return true;
            //不存在返回false
        else
            return false;
    }

    //根据用户名获取对应的索引
    public static int GetIndex(ArrayList ulist, String word) {
        //存在返回对应的索引
        for (int i = 0; i < ulist.size(); i++) {
            Users u = (Users) ulist.get(i);
            if (u.getUser_name().equals(word))
                return i;
        }
        //不存在返回-1
        return -1;
    }

    //登录
    public static boolean Denglu(ArrayList ulist) {
        Scanner sc = new Scanner(System.in);
        //验证用户名
        System.out.println("请输入你的用户名：");
        String names = sc.next();
        //用户名合法性检验
        if(!Name(names))
            return false;
        int index = GetIndex(ulist, names);

        if (index == -1) {
            System.out.println("用户名未注册，请先注册！");
            return false;
        }
        Users u = (Users) ulist.get(index);
        //通过手机号码或身份证号码验证
        if(!YanF(u))
            return false;  // 验证失败

        //验证密码
        if(!YanS(u))
            return false;  // 验证失败
        return true;

    }

    //登录验证方式
    public static boolean YanF(Users u){
        Scanner sc = new Scanner(System.in);
        //对手机号码或身份证号码进行验证
        int count = 1;  // 控制用户验证的次数
        while(count<=3){
            System.out.println("验证方式：1.手机号码验证  2.身份证号码验证");
            System.out.println("请你选择验证方式：");
            String x = sc.next();
            switch(x){
                case "1":{
                    System.out.println("请输入你的手机号码：");
                    String phones = sc.next();
                    if(!Phone(phones)){
                        System.out.println("你还剩"+(3-count)+"次机会，");
                        count++;
                        break;
                    }
                    if(phones.equals(u.getUser_phone())){
                        return true;
                    }else{
                        System.out.println("手机号码错误，请重新输入！");
                        System.out.println("你还剩"+(3-count)+"次机会，");
                        count++;
                        break;
                    }
                }

                case "2": {
                    System.out.println("请输入你的身份证号码：");
                    String ids = sc.next();
                    if(!Phone(ids)){
                        System.out.println("你还剩"+(3-count)+"次机会，");
                        count++;
                        break;
                    }
                    if(ids.equals(u.getUser_Id())){
                        return true;
                    }else{
                        System.out.println("身份证号码错误，请重新输入！");
                        System.out.println("你还剩"+(3-count)+"次机会，");
                        count++;
                        break;
                    }
                }
                default:
                    System.out.println("选择错误，请重新选择！");
            }
        }
        if(count>3)
            System.out.println("你的账号已经被锁定!");
        return false;
    }

    //登录验证密码，失败返回false,成功返回true
    public static boolean YanS(Users u){
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请你输入密码：");
            String ps = sc.next();
            if(u.getUser_password().equals(ps))
                return true;
            else {
                System.out.println("密码错误！");
                System.out.println("你还剩下"+(2-i)+"次机会！");
            }
        }
        System.out.println("你的账号已被锁定！");
        return false;
    }

    //忘记密码
    public static boolean Wangji(ArrayList ulist){
        Scanner s = new Scanner (System.in);
        while (true) {
            System.out.println("请输入你的手机号码：");
            String ph = s.next();
            if(!Phone(ph))
                return false;
            else
                break;
        }
        String ids = null;
        while (true) {
            System.out.println("请输入你的身份证号码：");
            ids = s.next();
            if(!Id(ids))
                return false;
            else
                break;
        }
        //用户输入的手机号码和身份证号码合法，才能修改密码
        YanZ(ulist,ids);
        return true;
    }

    //忘记密码,对密码进行修改
    public static boolean YanZ(ArrayList ulist,String ids){
        Scanner s = new Scanner (System.in);
        //根据身份证号码判断用户是否存在
        int indexs = GetIndexs(ulist,ids);
        if(indexs==-1){
            System.out.println("该用户不存在，请注册后再尝试！");
            return false;
        }
        Users ser = (Users) ulist.get(indexs);
        while(true){
        System.out.println("请你输入修改后的密码");
        String si1 = s.next();
        System.out.println("请你再次确认密码");
        String si2 = s.next();
        //判断二次输入的密码是否相同，不同重新输入
        if(Password(si1,si2)){
            ser.setUser_password(si1);
            return true;
        }
        }
    }

    //根据身份证号获取对应索引
    public static int GetIndexs(ArrayList ulist, String ids){
        for (int i = 0; i < ulist.size(); i++) {
            Users s = (Users)ulist.get(i);
            if(s.getUser_Id().equals(ids))
                return i;
        }
        return -1;
    }
}